package cmds

import (
	"fmt"
	"os"
	"strconv"
	"strings"
	"time"

	"github.com/spf13/cobra"
	"github.com/xuri/excelize"

	"dev1.dfitc/futures/xls-update/total"
)

var totalCmd = &cobra.Command{
	Use:     "total",
	Short:   "成交量累计",
	Long:    `成交量累计`,
	Example: `  xls-update total`,
	Run: func(cmd *cobra.Command, args []string) {
		if len(args) == 0 {
			fmt.Println("errors: args#0 需要给出模板路径")
			return
		}
		if strings.EqualFold("", args[0]) {
			fmt.Println("errors: args#0 模板路径不能为空")
			return
		}

		// 检查日期参数
		// 如果用户没有输入日期，则设置为当前日期
		if strings.EqualFold("", TradeDate) {
			timestamp := time.Now().Unix()
			tm := time.Unix(timestamp, 0)
			TradeDate = tm.Format("20060102")
		}

		// 交易日期
		tTradeDate, err := time.Parse("20060102", TradeDate)
		if err != nil {
			fmt.Println("errors: " + err.Error())
			return
		}
		//strDate := tTradeDate.Format("2006/1/2")
		strDate := tTradeDate.Format("01-02-06")

		// 打开输出文件
		xlsx, err := excelize.OpenFile(args[0])
		if err != nil {
			fmt.Println("errors: " + err.Error())
			return
		}

		// 获取 sheet index
		sheetTotoal := xlsx.GetSheetIndex("成交量累计")
		totalIndex := "sheet" + strconv.Itoa(sheetTotoal)
		sheetLeader := xlsx.GetSheetIndex("所内领导")
		leaderIndex := "sheet" + strconv.Itoa(sheetLeader)

		// 获取行数据
		rows := xlsx.GetRows(totalIndex)

		// 初始为最后一行
		lastLine := len(rows)
		workLine := lastLine + 1

		// 检查是否已经设置过
		// 默认只检查最近的60条历史
		start := len(rows) - History
		end := len(rows)
		if start <= 0 {
			start = 1
		}
		for i := start; i <= end; i++ {
			dateStr := xlsx.GetCellValue(totalIndex, "A"+strconv.Itoa(i))
			if strings.EqualFold(strDate, dateStr) { // 与交易日期相同
				lastLine = i - 1
				workLine = lastLine + 1
				break
			} else if strings.EqualFold("", dateStr) { // 空行，一般是手工修改的行
				lastLine = i - 1
				workLine = lastLine + 1
				break
			}

			tDate, errt := time.Parse("01-02-06", dateStr)
			if errt != nil {
				fmt.Println(errt)
				lastLine = -1
				workLine = -1
				break
			}

			if i == 0 && tTradeDate.Before(tDate) {
				lastLine = -1
				workLine = -1
				break
			}
		}

		// 交易日期超出历史记录范围
		if -1 == lastLine && -1 == workLine {
			fmt.Println("交易日期超出历史检查范围")
			fmt.Println("交易日期为：" + strDate)

			// 更新公式计算
			xlsx.UpdateLinkedValue()

			// 提示用户异常
			fmt.Println("异常退出")

			// 输出
			err = xlsx.Save()
			if err != nil {
				fmt.Println("errors: " + err.Error())
				os.Exit(1)
			}
			return
		}

		fmt.Println("处理的行号 " + strconv.Itoa(workLine))

		total.Update(xlsx, totalIndex, leaderIndex, tTradeDate, workLine, lastLine, LeaderDalianColummn, LeaderZhengzhouColummn, LeaderShangHaiColummn)

		// 更新公式计算
		xlsx.UpdateLinkedValue()

		fmt.Println("修改完成")

		// 输出
		errs := xlsx.Save()
		if errs != nil {
			fmt.Println(errs)
			os.Exit(1)
		}
	},
}

func init() {
	totalCmd.Flags().IntVarP(&History, "history", "", 60, "检查时，参考的最后多少条记录, 默认最近60条记录")
	totalCmd.Flags().StringVarP(&LeaderDalianColummn, "dalian", "", "", "所内领导sheet的大连总计单元格索引")
	totalCmd.Flags().StringVarP(&LeaderZhengzhouColummn, "zhengzhou", "", "", "所内领导sheet的郑州总计单元格索引")
	totalCmd.Flags().StringVarP(&LeaderShangHaiColummn, "shanghai", "", "", "所内领导sheet的上海总计单元格索引")
	totalCmd.Flags().StringVarP(&TotalLine, "totalLine", "", "", "所内领导sheet的累计所在行号")
	rootCmd.AddCommand(totalCmd)
}
